home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga News 95
/
Amiga News 95.iso
/
dpat
/
dpat01
/
data
/
data.asm
< prev
next >
Wrap
Assembly Source File
|
1992-07-21
|
5KB
|
212 lines
ExecBase = 4
OldOpenLib = -408
CloseLib = -414
Output = -60
Write = -48
Open = -30
Close = -36
Read = -42
Main:
movem.l D1-D7/A0-A6,-(SP) ; Sauvegarde des registres
subq.w #1,D0
beq Erreur ; Erreur : paramètres inexistants
NoSpace: ; Suppression des espaces
cmpi.b #32,(A0)+
bne.s Param1
dbf D0,NoSpace
bra Erreur ; Erreur : paramètres insuffisants
Param1:
lea File,A1
subq.l #1,A0
Found:
move.b (A0)+,(A1)+ ; Récupération nom du fichier source
cmpi.b #32,(A0)
beq.s NoSpace2
dbf D0,Found
bra Erreur ; Erreur : paramètres insuffisants
NoSpace2: ; Suppression des espaces
cmpi.b #32,(A0)+
bne.s Param2
dbf D0,NoSpace2
bra Erreur ; Erreur : paramètres insuffisants
Param2:
move.b -1(A0),Suffix ; Récupération de l'extension
cmpi.b #32,(A0)
beq.s Label1
cmpi.b #10,(A0)
bne Erreur ; Erreur : paramètres invalides
Label1:
cmpi.b #'w',Suffix
beq.s Label3
cmpi.b #'b',Suffix
bne.s Label2
move.b #12,Nombre ; 12 Données par ligne
move.w #1,NbOctets
bra.s Label3
Label2:
cmpi.b #'l',Suffix
bne Erreur ; Erreur : paramètres invalides
move.b #5,Nombre ; 5 Données par ligne
move.w #4,NbOctets
Label3:
move.l ExecBase,A6
lea DosLib,A1
moveq #0,D0
jsr OldOpenLib(A6) ; Ouverture de la Dos Library
move.l D0,DosBase
move.l D0,A6
jsr Output(A6)
move.l D0,StdOut ; Adresse de la structure de sortie
move.l #1005,D2 ; Old Mode
move.l #File,D1 ; Fichier à ouvrir
jsr Open(A6)
move.l D0,FileHandle
beq NoFile ; Erreur : Fichier Inexistant
move.w NbOctets,D2 ; Calcul du compteur
add.w D2,D2 ; de boucle de la
subq.w #1,D2 ; conversion héxadécimale
move.w D2,Cpt ; (2, 4, ou 8 chiffres)
moveq #0,D5 ; RAZ du compteur de data par ligne
Lecture:
move.l FileHandle,D1
move.l #Data,D2 ; Adresse du tampon de lecture
moveq #0,D3
move.w NbOctets,D3 ; Nb d'octets à lire
jsr Read(A6)
tst.w D0 ; Fin de fichier ?
beq.s LastLine ; Oui, c'est la dernière ligne
move.b D0,Nb ; Nb d'octets lus
tst.b D5 ; On entame une nouvelle ligne ?
bne.s Suite ; Non !
lea Ligne2,A5
Suite:
move.l Data,D0 ; Donnée à traduire
bsr Bin2Hex ; Conversion Binaire -> Hexa
bra.s Lecture ; Donnée suivante !
LastLine:
tst.b D5 ; La dernière ligne est elle vide ?
beq.s Sortie ; Oui, alors on sort
move.b #10,(A5)+ ; Sinon on l'affiche
move.b #0,(A5)
move.w NbOctets,D2
subq.l #1,A5
Boucle:
cmp.b Nb,D2 ; On complète la dernière
beq.s DispLine ; donnée avec des zéros
move.b #48,-(A5) ; s'il y a lieu :
move.b #48,-(A5) ; par exemple, pour afficher en
subq.b #1,D2 ; mots longs un fichier au
bra.s Boucle ; nombre d'octets impair
DispLine:
lea Ligne,A0
bsr Affiche
Sortie:
move.l FileHandle,D1
jsr Close(A6)
Fin:
move.l ExecBase,A6
move.l DosBase,A1
jsr CloseLib(A6)
movem.l (SP)+,D1-D7/A0-A6 ; Réinitialisation des registres
clr.l D0 ; Annulation du drapeau d'erreur
rts ; Retour au système
Erreur: ; Affichage de la syntaxe
move.l ExecBase,A6 ; de la commande
lea DosLib,A1
moveq #0,D0
jsr OldOpenLib(A6)
move.l D0,DosBase
move.l D0,A6
jsr Output(A6)
move.l D0,StdOut
lea Syntaxe,A0
bsr Affiche
bra.s Fin
NoFile: ; Affichage du message d'erreur
lea NotFound,A0 ; de fichier non trouvé
bsr Affiche
bra.s Fin
Affiche:
move.l A0,D2
moveq #0,D3
NextCar:
addq.b #1,D3 ; Calcul du nombre de caractères
tst.b (A0)+ ; de la chaine à afficher
bne.s NextCar
subq.b #1,D3
move.l StdOut,D1
jsr Write(A6) ; (file, buffer, length) (D1, D2, D3)
rts
Bin2Hex: ; (Nombre binaire D0)
tst.b D5 ; Est-ce la première valeur ?
beq.s NoComma ; Oui, donc pas de virgule devant
move.b #',',(A5)+
NoComma:
move.b #'$',(A5)+
move.l D0,D1
move.w Cpt,D2 ; Cpt = 2, 4 ou 8 chiffres
Hexa1:
rol.l #4,D1 ; Conversion par Quartets
move.b D1,D0
andi.b #$F,D0
addi.b #48,D0
cmpi.b #58,D0 ; Est-ce un chiffre (0-9) ?
blt.s Hexa2
addq.b #7,D0 ; Non, c'est une lettre (A-F)
Hexa2:
move.b D0,(A5)+
dbf D2,Hexa1
addq.b #1,D5
cmp.b Nombre,D5 ; La ligne n'est pas complète
bne.s Suivant ; donc on continue
move.b #10,(A5)+ ; Sinon on l'affiche
move.b #0,(A5)
lea Ligne,A0
bsr Affiche
moveq #0,D5 ; RAZ du compteur de data par ligne
Suivant:
rts
DosBase:
dc.l 0
StdOut:
dc.l 0
DosLib:
dc.b 'dos.library',0
even
File:
blk.b 80,0
FileHandle:
dc.l 0
Data:
dc.l 0
Nb:
dc.b 0
Nombre:
dc.b 8
NbOctets:
dc.w 2
Cpt:
dc.w 0
Ligne:
dc.b ' dc.'
Suffix:
dc.b 'w '
Ligne2:
blk.b 50,0
Syntaxe:
dc.b 10,' USAGE: DATA [>Dest_File] <File_Name> <b.w.l>',10,10,0
even
NotFound:
dc.b 10,' File Not Found !',10,10,0